/*
	#########################################################
	#			Verzhak										#
	#	e-mail - <verzhak@gmail.com>						#
	#########################################################
	#	Version - 0.0.2										#
	#	Date - 01.03.2009									#
	#	License - GPLv3										#
	#########################################################
*/

#include "get_rss.h"

// Далее - переопределение функций сетевого взаимодействия

/* Получение ip из строки в виде целого
 * (inet_aton) */ 
int my_inet_aton(const char *cp,struct in_addr *inp)
{
	int a, b, c, d;
	char addr[4];
	sscanf(cp, "%d.%d.%d.%d", &a, &b, &c, &d);
	addr[0] = a;
	addr[1] = b;
	addr[2] = c;
	addr[3] = d;
	inp->s_addr = *(unsigned int *)addr;
	return 1;
}

/* Создание сокета
 * (socket) */
SOCKTYPE my_socket(int domain, int type, int protocol)
{
	SOCKTYPE sk = NULL;
	int ret = 0;
	ret = sock_create(domain, type, protocol, &sk);
	if (ret < 0)
		return NULL;
	return sk;
}

/* Установка связи
 * (connect) */
int my_sock_connect(SOCKTYPE socket, struct sockaddr *address, int address_len)
{
	return socket->ops->connect(socket, address, address_len,0);
}

/* Отправляем данные
 * (send) */
ssize_t my_send(SOCKTYPE socket, const void *buffer, size_t length, int flags)
{
	// Нечто похожее есть и в user-space
	struct msghdr msg;
	struct iovec iov;
	int len;
	mm_segment_t old_fs;
	iov.iov_base = (void *)buffer;
	iov.iov_len = (__kernel_size_t)length;
	// Описываем сообщение
	msg.msg_name = NULL;
	msg.msg_namelen = 0;
	msg.msg_iov = &iov;
	msg.msg_iovlen = 1;
	msg.msg_control = NULL;
	msg.msg_controllen = 0;
	msg.msg_flags = flags;
	old_fs = get_fs();
	set_fs(KERNEL_DS);
	// Отправляем сообщение
	len = sock_sendmsg(socket, &msg, length);
	set_fs(old_fs);
	return len;
}

/* Принимаем данные от сервера
 * (recv) */
ssize_t my_recv(SOCKTYPE socket, void *buffer, size_t length, int flags)
{
	struct msghdr msg;
	struct iovec iov;
	int ret;
	mm_segment_t old_fs;
	iov.iov_base = (void *)buffer;
	iov.iov_len = (__kernel_size_t)length;
	msg.msg_name = NULL;
	msg.msg_namelen = 0;
	msg.msg_iov = &iov;
	msg.msg_iovlen = 1;
	msg.msg_control = NULL;
	msg.msg_controllen = 0;
	old_fs = get_fs();
	set_fs(KERNEL_DS);
	ret = sock_recvmsg(socket, &msg, length, flags);
	set_fs(old_fs);
	return ret;
}

/* Закрываем соединение
 * (close) */
int my_close(SOCKTYPE socket)
{
	int ret;
	ret = socket->ops->release(socket);
	if (socket)
		sock_release(socket);
	return ret;
}

